package br.pesquisa.lsystem.gui;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;

import br.pesquisa.lsystem.Celula;
import br.pesquisa.lsystem.Interpretador;

public abstract class CellPanel extends JPanel implements Observer {
	private List<List<Celula>> estados = new ArrayList<List<Celula>>();
	private int maxElementos = 0;
	private int iteracoes;
	private MainFrame frame;

	public CellPanel(MainFrame frame) {
		this.frame = frame;
	}

	public List<List<Celula>> getEstados() {
		return estados;
	}

	public void setEstados(List<List<Celula>> estados) {
		this.estados = estados;
	}

	public int getMaxElementos() {
		return maxElementos;
	}

	public void setMaxElementos(int maxElementos) {
		this.maxElementos = maxElementos;
	}

	public int getIteracoes() {
		return iteracoes;
	}

	public void setIteracoes(int iteracoes) {
		this.iteracoes = iteracoes;
	}

	public MainFrame getFrame() {
		return frame;
	}

	public void setFrame(MainFrame frame) {
		this.frame = frame;
	}

	public abstract void init();

	@SuppressWarnings("unchecked")
	public void update(Observable o, Object arg) {
		Interpretador<Celula> interpretador = (Interpretador) o;
		estados.add(interpretador.getEstado());
		if(interpretador.getEstado().size() > maxElementos) {
			maxElementos = interpretador.getEstado().size(); 
		}

		if(iteracoes == 0) {
			doStart();
		}
		
		doUpdate(interpretador);

		if (++iteracoes == interpretador.getNumeroIteracoes()) {
			frame.getStartButton().setEnabled(true);
			frame.getButtonAdicionar().setEnabled(true);
			frame.getButtonLimpar().setEnabled(true);
			iteracoes = 0;
			doStop(interpretador);
		}
	}

	public abstract void doStart();

	public abstract void doUpdate(Interpretador<Celula> interpretador);

	public abstract void doStop(Interpretador<Celula> interpretador);
}
